In data processing systems, Input/Output (I/O) operations are generally used to store data to, or retrieve data from, mass storage devices. Such devices may include tapes, disks, flash memory devices, and other retentive data storage media. Such I/O operations may also be used to transfer data across networks, such as Local Area Networks (LANs), Wide Area Networks (WANs), and other communication infrastructures.
A typical I/O request may be initiated as follows. An application program makes a request to an operating system (OS) of a data processor to initiate an I/O operation. The request may indicate the type of I/O operation that is to be performed (e.g., read versus write), an address of a buffer in memory from which, or to which, data is to be transferred, and the amount of data that is to be transferred. The buffer address may be described as a virtual address within virtual, rather than physical, address space.
In response to such a request, the OS may perform an address translation function that will translate any provided virtual address into one or more physical addresses. The physical addresses are the addresses that will be used by an I/O device to access the physical area in memory to which data will be stored, or from which data will be retrieved, during the I/O operation. The OS will also take actions to lock the buffer in memory. This ensures that while the I/O operation is occurring, the buffer will not be re-located within virtual address space, and that the buffer will not be paged out of memory.
After the OS has performed the address translation and locked the buffer in memory, the OS will issue a request to the appropriate I/O device, such as an I/O processor. The I/O device will transfer data to, or retrieve data from, the memory buffer. When the I/O operation is complete, the I/O device will generally initiate an interrupt to the OS. The memory buffer that was used to perform the I/O operation is then unlocked, and may be re-allocated for a different use.
The overhead associated with the OS performing address translation and locking of the buffer is not insignificant. If many I/O operations are occurring within memory at once, this overhead can impact system performance. To address this limitation, some prior art systems dedicate memory areas specifically for use in performing I/O operations. The address translation and locking operations associated with these dedicated memory areas are performed at the time these areas are created, or alternatively when the memory areas are first used. This eliminates the need to perform these tasks at the time an I/O request is issued, thereby minimizing the time required to complete the request. However, this use of dedicated I/O memory areas can create problems in data processing systems that are “partitionable”.
A partitionable data processing system is one that supports the creation of multiple processing partitions. A processing partition is a processing environment that includes at least a subset of all of the resources of that data processing system. For instance, in a system wherein multiple instruction processors (IPs) are coupled to a main memory, a partitionable system may be configured into two processing partitions. Each partition will generally include at least one IP and a portion of main memory. The resources of a given partition are communicatively coupled to one another, but logically isolated from the resources of other processing partitions via software and/or hardware enables. This allows the resources of a partition to operate substantially independently from the rest of the system under the control of a dedicated operating system instance. In this manner, a first processing partition may be executing one or more software applications independently of any execution that is occurring within one or more other partitions of the same data processing system.
It is often desirable to modify the way a data processing system is partitioned. This may involve moving a processor, an I/O device, and/or a memory area that was previously included within one partition to a different partition, for example. In prior art systems, complications arise if a memory area dedicated to performing I/O operations is to be moved between first and second partitions in this manner. To enable this re-partitioning activity to complete successfully, it is generally necessary to halt I/O activity occurring within the first partition, re-partition the memory, and then re-start the I/O activity. As may be appreciated, this disrupts normal system operations and results in delay.
What is needed, therefore, is a system and method that allows I/O operations to be performed in an optimized manner that addresses at least some of the above-described limitations.